﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SoftwareConsulting.BI11.NumericalMethods.Approximation
{
    /// <summary>
    /// Класс приближения Ньютона
    /// </summary>
    public class NewtonApproximation 
    {
        private const double m = 2.41064f;
        private const double M = 20.0828f;
        private double _result;

        /// <summary>
        /// Конструктор по умолчанию
        /// </summary>
        /// <param name="function">Функция, требующая решения</param>
        /// <param name="leftBorder">Левая граница интервала множества</param>
        /// <param name="rightBorder">Правая граница интервала множества</param>
        /// <param name="x0">Начальное условие</param>
        /// <param name="epsilon">Точность расчетов</param>
        public NewtonApproximation(FunctionWithOneArgument function, FunctionWithOneArgument dfunction, double leftBorder, double rightBorder, double x0, double epsilon)
        {
            _result = 0;
            double xk = x0;
            do
            {
                x0 = xk;
                xk = x0 - (function(x0) / dfunction(x0));
            }
            while (Math.Abs(xk - x0) > Math.Sqrt(Math.Abs(2f * epsilon * m / M)));
            _result = x0;
        }

        /// <summary>
        /// Возвращает решение
        /// </summary>        
        public double GetSolution()
        {
            return _result;
        }
    }
}
